/*
 * Copyright (C) 2019 ~ 2022 Uniontech Software Technology Co.,Ltd.
 *
 * Author:     yanghongwei <yanghongwei@uniontech.com>
 *
 * Maintainer: yanghongwei <yanghongwei@uniontech.com>
 */
#ifndef __LOGIN_LIMIT_H__
#define __LOGIN_LIMIT_H__

#include <QTime>
#include <QDateTime>
#include <QList>
#include <QMap>

#include <ctime>

class QTimer;
/**
 * @brief 处理用户登录时间段限制的功能
 */
class LoginTimeLimit
{
public:
    LoginTimeLimit();
    virtual ~LoginTimeLimit();

    // 执行策略
    int runPolicy(const QString &config);
    // 执行默认策略(服务端不下发时的执行场景)
    int runDefault();

private:
    void setIamInfo(); // 设置iam中的用户登录限制信息
    bool isLocked() const; // 当前是否已锁屏
    void startLockScreen() const; // 启动锁屏
    void showOsdUI(const QString &context, int timeout = 3) const; // 提示用户信息
    void hideOsdUI() const; // 隐藏提示信息
    /**
     * @brief 判断是否需要提示用户
     * @return true 需要提示用户
     */
    bool isNeedWarning() const;

    void updateInterval(); // 根据时间更新定时器周期
    void updateRemainTime(int time = -1); // 更新剩余时间

private:
    /**
     * @brief 登录时间段<开始时间，结束时间>
     */
    typedef struct {
        std::string startTime;
        std::string endTime;
    } LoginTime;
    typedef QList<LoginTime> LoginTimes;
    /**
     * @brief 锁屏剩余时间信息
     */
    class RemainTime
    {
    public:
        int time;
        bool firstShow;
        bool secondShow;

        RemainTime()
        {
            clear();
        }

        void clear()
        {
            time = -1;
            firstShow = false;
            secondShow = false;
        }
    };

    QMap<int, LoginTimes> m_allLoginTimes; // 存储所有登录时间段<周一，...><周二，...>
    QTimer *m_timer; // 校验登录时间是否允许
    RemainTime m_remainTime; // 距离锁屏剩余时间信息
    bool m_enablePolicy; // 策略是否开启
    bool m_locked; // 锁屏状态
};

#endif /* __LOGIN_LIMIT_H__ */